package com.llh.demo4shiro.utils;

import at.favre.lib.crypto.bcrypt.BCrypt;

/**
 * 密码加密和匹配工具。
 * <p>
 * 加密算法采用BCrypt系列中的算法，
 * <p>CreatedAt: 2020/9/16 15:46</p>
 *
 * @author llh
 */
public class PasswordUtil {
    /**
     * 哈希次数。密码被哈希的次数。
     * 哈希次数的最大最小值是有规范的，不能乱写。
     * <p>
     * 哈希次数越大，运算时间越长！
     */
    private static final int HASH_COUNT = BCrypt.MIN_COST;
    /**
     * BCrypt版本。影响哈希后字符的形式与长度。
     */
    private static final BCrypt.Version BCRYPT_VERSION = BCrypt.Version.VERSION_2A;

    /**
     * 加密密码
     *
     * @param password 原始密码
     * @return 加密后的密码
     */
    public static String hash(String password) {
        return BCrypt.with(BCRYPT_VERSION)
                .hashToString(HASH_COUNT, password.toCharArray());
    }

    /**
     * 匹配密码
     *
     * @param rawPassword  原始密码
     * @param hashPassword 加密后的密码
     * @return 原始密码与加密后的密码是否匹配。
     */
    public static boolean match(String rawPassword, String hashPassword) {
        return BCrypt.verifyer()
                .verify(rawPassword.toCharArray(), hashPassword)
                .verified;
    }
}
